package jpasearch.repository.util;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import jpasearch.repository.query.SearchParameters;
import jpasearch.repository.query.selector.ObjectTermSelector;
import jpasearch.repository.query.selector.PropertySelector;
import jpasearch.repository.query.selector.Range;
import jpasearch.repository.query.selector.Selector;
import jpasearch.repository.query.selector.Selectors;
import jpasearch.repository.query.selector.StringTermSelector;
/**
* @author speralta
*/
@Named
@Singleton
public class BySelectorUtil {
private ByFullTextUtil byFullTextUtil;
private ByRangeUtil byRangeUtil;
private ByPropertySelectorUtil byPropertySelectorUtil;
private JpaUtil jpaUtil;
public <E> Predicate bySelectors(Root<E> root, CriteriaBuilder builder, SearchParameters<E> sp) {
return bySelectors(root, builder, sp.getSelectors());
}
@SuppressWarnings("unchecked")
private <E> Predicate bySelectors(Root<E> root, CriteriaBuilder builder, Selectors<E> selectors) {
List<Predicate> predicates = new ArrayList<>();
for (Selector<E, ?> selector : selectors.getSelectors()) {
if (selector instanceof Selectors) {
predicates.add(bySelectors(root, builder, (Selectors<E>) selector));
} else if (selector instanceof PropertySelector) {
predicates.add(byPropertySelectorUtil.byPropertySelectors(root, builder, (PropertySelector<? super E, ?>) selector));
} else if (selector instanceof Range) {
predicates.add(byRangeUtil.byRange(root, builder, (Range<E, ?>) selector));
} else if (selector instanceof StringTermSelector) {
predicates.add(byFullTextUtil.byFullText(root, builder, (StringTermSelector<E>) selector));
} else if (selector instanceof ObjectTermSelector) {
predicates.add(byFullTextUtil.byFullText(root, builder, (ObjectTermSelector<E>) selector));
}
}
if (selectors.isAndMode()) {
return jpaUtil.andPredicate(builder, predicates);
} else {
return jpaUtil.orPredicate(builder, predicates);
}
}
@Inject
public void setByFullTextUtil(ByFullTextUtil byFullTextUtil) {
this.byFullTextUtil = byFullTextUtil;
}
@Inject
public void setByRangeUtil(ByRangeUtil byRangeUtil) {
this.byRangeUtil = byRangeUtil;
}
@Inject
public void setByPropertySelectorUtil(ByPropertySelectorUtil byPropertySelectorUtil) {
this.byPropertySelectorUtil = byPropertySelectorUtil;
}
@Inject
public void setJpaUtil(JpaUtil jpaUtil) {
this.jpaUtil = jpaUtil;
}
}